package main

//import (
//	"bufio"
//	"fmt"
//	"io"
//	"os"
//	"strings"
//	"time"
//)
//
//// 将程序的读取、写入功能单独封装为接口，便于后续扩展
//type Reader interface {
//	Read(rc chan []byte)
//}
//
//type Writer interface {
//	Write(wc chan string)
//}
//
//type ReadFromFile struct {
//	path string // 读取文件的路径
//}
//
//type WriteToInfluxDB struct {
//	influxDBDsn string // influx data source
//}
//
//type LogProcess struct {
//	rc    chan []byte // 读取channel, 从读取模块到解析模块传递数据
//	wc    chan string // 写入channel, 从解析模块到写入模块传递数据
//	read  Reader
//	write Writer
//}
//
//// 读取模块
//	// 重写Read方法，实现Reader接口，传入string类型channel变量rc
//func (r *ReadFromFile) Read(rc chan []byte) {
//	// 1.打开文件
//	f, err := os.Open(r.path)
//	if err != nil {
//		panic(fmt.Sprintf("open file error:%s", err.Error()))
//	}
//
//	// 2.从文件末尾开始逐行读取文件内容
//	f.Seek(0, 2) // 移动文件指针到最后一行
//	rd := bufio.NewReader(f)
//
//	// 循环读取递增的文件内容
//	for {
//		line, err := rd.ReadBytes('\n') // 读取文件的最后一行
//		if err == io.EOF {							// 读取到文件末尾
//			time.Sleep(500 * time.Millisecond)
//			continue
//		} else if err != nil {
//			panic(fmt.Sprintf("ReadBytes erros:%s", err.Error()))
//		}
//		rc <- line[:len(line)-1] // 写入文件最后一行数据到rc通道，并去除\n
//	}
//}
//
//// 解析模块
//func (l *LogProcess) Process() {
//	// 注意学习这里对于channel的遍历方式
//	for v := range l.rc {
//		l.wc <- string(strings.ToUpper(string(v)))
//	}
//}
//
//// 写入模块
//func (w *WriteToInfluxDB) Write(wc chan string) {
//	for v := range wc {
//		fmt.Println(v) // 从wc channel读取数据
//	}
//}
//
//func main() {
//	r := &ReadFromFile{
//		path: "./access.log", // 这里的access.log文件需提前创建好，不然会报错
//	}
//
//	w := &WriteToInfluxDB{
//		influxDBDsn: "username&password..",
//	}
//
//	// 初始化结构体
//	lp := &LogProcess{
//		// 使用make()函数初始化channel
//		rc:    make(chan []byte),
//		wc:    make(chan string),
//		read:  r,
//		write: w,
//	}
//
//	// 使用go关键字创建goroutine, 使三个协程并发执行
//	go lp.read.Read(lp.rc)
//	go lp.Process()
//	go lp.write.Write(lp.wc)
//
//	// main goroutine睡眠1s, 等待其他goroutine的运行
//	time.Sleep(30 * time.Second)
//}
